package model;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.PostRemove;

import org.eclipse.persistence.annotations.CascadeOnDelete;

@Entity
public class Belegung implements IEntity
{
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	private long id;
	@ManyToMany(cascade = CascadeType.PERSIST)
	private List<Kunde> kunden = new ArrayList<Kunde>();
	@ManyToOne(cascade = CascadeType.PERSIST)
	private Zimmer zimmer;
	@ManyToOne(cascade = CascadeType.PERSIST)
	private Reservierung reservierung;

	public Belegung()
	{

	}

	public Belegung(List<Kunde> kunden, Zimmer zimmer)
	{
		for (Kunde k : kunden)
			this.addKunde(k);

		if (zimmer != null)
			zimmer.addBelegung(this);
	}
	public int nrOfAdults(){
		int i = 0; 
		for(Kunde k : kunden){
			if(k.isAdult()){
				i++;
			}
		}
		return i;
	}
	public int nrOfChildren(){
		return (kunden.size() - nrOfAdults());
	}

	// ##################################################################
	// ======================== Business Logic ==========================

	@PostRemove
	public void postRemove()
	{
		if (this.reservierung != null)
			this.reservierung.getBelegungen().remove(this);
		for (Kunde kunde : kunden)
		{
			kunde.getBelegungen().remove(this);
		}
		if (this.zimmer != null)
			this.zimmer.getBelegungen().remove(this);
	}

	// ##################################################################
	// ================== Setters and getters start =====================

	public void addKunde(Kunde kunde)
	{
		kunden.add(kunde);
	}

	public void removeKunde(Kunde kunde)
	{
		kunden.remove(kunde);
	}

	public void setZimmer(Zimmer zimmer)
	{
		this.zimmer = zimmer;
	}

	public void setReservierung(Reservierung reservierung)
	{
		this.reservierung = reservierung;
	}

	public Zimmer getZimmer()
	{
		return this.zimmer;
	}

	public Reservierung getReservierung()
	{
		return this.reservierung;
	}

	public List<Kunde> getKunden()
	{
		return kunden;
	}

}
